package app.modules.infrastructure.lov.persistence.dao;

import app.modules.infrastructure.lov.dto.web.WebValueSetDTO;
import app.modules.infrastructure.lov.dto.web.WebValueSetQueryDTO;
import app.modules.infrastructure.lov.persistence.entity.ValueSetEO;
import app.modules.infrastructure.lov.persistence.mapper.ValueSetMapper;
import app.modules.infrastructure.lov.util.conversion.ValueSetConvertUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jasmine.framework.common.util.CheckUtil;
import jasmine.framework.common.util.StringUtil;
import jasmine.framework.context.CurrentSubject;
import jasmine.framework.database.mybatisplus.dao.BaseI18nEntityDAO;
import jasmine.framework.database.mybatisplus.wrapper.LambdaQueryWrapperWithI18n;
import org.springframework.stereotype.Repository;

import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;

/**
 * @author mh.z
 */
@Repository
public class ValueSetDAO extends BaseI18nEntityDAO<ValueSetMapper, ValueSetEO> {

    /**
     * 分页查询值集
     *
     * @param query
     * @param page
     * @return
     */
    public List<WebValueSetDTO> pageWebValueSetDTOsByCond(WebValueSetQueryDTO query, Page page) {
        CheckUtil.notNull(query, "query null");
        CheckUtil.notNull(page, "page null");
        LambdaQueryWrapperWithI18n<ValueSetEO> wrapper = LambdaQueryWrapperWithI18n.wrapper();

        // 代码
        String valueSetCode = query.getValueSetCode();
        wrapper.like(StringUtil.isNotEmpty(valueSetCode), ValueSetEO::getValueSetCode, valueSetCode);
        // 名称
        String valueSetName = query.getValueSetName();
        wrapper.likeWithI18n(StringUtil.isNotEmpty(valueSetName), ValueSetEO::getValueSetName, valueSetName);
        // 描述
        String valueSetDesc = query.getValueSetDesc();
        wrapper.likeWithI18n(StringUtil.isNotEmpty(valueSetDesc), ValueSetEO::getValueSetDesc, valueSetDesc);
        // 启用标志
        wrapper.eq(Boolean.TRUE.equals(query.getEnableFlagOnly()), ValueSetEO::getEnableFlag, true);
        // 租户ID
        wrapper.eq(ValueSetEO::getTenantId, CurrentSubject.getTenantId());
        //
        wrapper.orderByAsc(ValueSetEO::getValueSetCode);

        Page<ValueSetEO> pageResult = baseMapper.selectPageWithI18n(page, wrapper);
        List<ValueSetEO> recordList = pageResult.getRecords();
        List<WebValueSetDTO> returnList = ValueSetConvertUtil.valueSetEO2WebValueSetDTO(recordList);

        return returnList;
    }

    /**
     * 根据值集代码统计
     *
     * @param valueSetCode
     * @param excludeIds
     * @return
     */
    public long countByValueSetCode(String valueSetCode, @Nullable Collection<Long> excludeIds) {
        LambdaQueryWrapper<ValueSetEO> wrapper = Wrappers.lambdaQuery();

        wrapper.eq(ValueSetEO::getValueSetCode, valueSetCode);
        wrapper.eq(ValueSetEO::getTenantId, CurrentSubject.getTenantId());
        wrapper.notIn(CollectionUtil.isNotEmpty(excludeIds), ValueSetEO::getId, excludeIds);

        return baseMapper.selectCount(wrapper);
    }

}
